# 构建阶段 - 使用多阶段构建减小最终镜像大小
FROM node:22.17.0 AS build-stage
# 使用Node.js官方镜像作为构建环境

# 设置工作目录
WORKDIR /app
# 在容器内创建并使用/app作为工作目录

# 安装pnpm（单独一层，便于缓存）
RUN npm install -g pnpm
# 全局安装pnpm包管理器，提高依赖安装速度

# 首先只复制package.json和pnpm-lock.yaml进行依赖安装
# 这样当源代码变更但依赖不变时，可以利用Docker缓存
COPY package.json pnpm-lock.yaml* ./
# 复制依赖描述文件到工作目录

# 安装项目依赖
RUN pnpm install
# 使用pnpm安装所有依赖

# 复制项目文件
COPY . .
# 复制所有源代码到工作目录

# 构建项目 (直接使用.env.production)
RUN pnpm build:prod
# 执行生产环境构建命令

# 部署阶段 - 使用轻量级的nginx镜像部署前端应用
FROM nginx:stable-alpine AS production-stage
# 使用Alpine版本的Nginx镜像减小体积

# 设置默认环境变量 (将在启动时用于动态配置nginx)
# 设置后端API地址的默认值
ENV BACKEND_URL=http://ruoyi-node-app:3000

# 创建自定义目录用于存储pid文件和其他临时文件
RUN mkdir -p /app/nginx/pid /app/nginx/cache /app/nginx/run /app/nginx/logs && \
    # 添加非root用户
    adduser -D -u 1000 -g 'www' www && \
    # 设置必要目录的权限
    chown -R www:www /app/nginx /var/cache/nginx /var/run /var/log/nginx /usr/share/nginx/html && \
    chmod -R 755 /app/nginx && \
    # 修改nginx配置以使用非root用户
    sed -i 's/user  nginx/user  www/g' /etc/nginx/nginx.conf && \
    # 修改pid文件路径
    sed -i 's/pid        \/var\/run\/nginx.pid/pid        \/app\/nginx\/pid\/nginx.pid/g' /etc/nginx/nginx.conf

# 复制nginx配置文件
COPY ./docker/nginx.conf /etc/nginx/conf.d/default.conf
# 使用自定义的nginx配置

# 从构建阶段复制构建结果到nginx html目录
COPY --from=build-stage --chown=www:www /app/dist /usr/share/nginx/html
# 复制构建产物并设置正确的所有权

# 暴露8620端口
EXPOSE 8620
# 声明容器使用的端口，与nginx配置中的端口一致

# 使用root用户启动nginx，但nginx worker进程会以www用户运行
# 这是因为nginx需要root权限来绑定低端口，但worker进程可以以非root用户运行
USER root
# 设置容器运行用户为root

# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD wget -q --spider http://127.0.0.1:8620/ || exit 1
# 定期检查应用是否正常运行

# 使用shell形式的CMD，在启动nginx前动态替换配置中的后端URL
CMD set -e && \
    # 规范化BACKEND_URL，确保格式正确
    # 1. 先去除末尾的斜杠（如果有）
    BACKEND_URL_CLEAN=${BACKEND_URL%/} && \
    # 2. 打印原始和处理后的URL（调试用）
    echo "原始BACKEND_URL: $BACKEND_URL" && \
    echo "处理后BACKEND_URL: $BACKEND_URL_CLEAN" && \
    # 3. 使用处理后的URL，明确添加斜杠和api路径
    echo "更新Nginx配置，将API请求代理到: ${BACKEND_URL_CLEAN}/api/" && \
    # 使用#作为sed分隔符，因为URL中包含/字符
    sed -i "s#proxy_pass http://ruoyi-node-app:3000/api/#proxy_pass ${BACKEND_URL_CLEAN}/api/#g" /etc/nginx/conf.d/default.conf && \
    # 打印修改后的配置（用于调试）
    grep -A 2 "proxy_pass" /etc/nginx/conf.d/default.conf && \
    # 启动nginx
    nginx -g "daemon off;" 